﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;

namespace ApiDoc.CodeSyntaxGenerators
{
    /// <summary>
    /// Interface for code generator of a specific language.
    /// </summary>
    public interface ICodeSyntaxGenerator
    {
        /// <summary>
        /// Returns the name of <paramref name="type"/> as it would be understood by a developer in the language.
        /// </summary>
        string GenerateName(Type type);

        /// <summary>
        /// Returns the name of <paramref name="method"/> as it would be understood by a developer in the language.
        /// </summary>
        string GenerateName(MethodInfo method);

        /// <summary>
        /// Returns the name of <paramref name="property"/> as it would be understood by a developer in the language.
        /// </summary>
        string GenerateName(PropertyInfo property);

        /// <summary>
        /// Returns the name of <paramref name="constructor"/> as it would be understood by a developer in the language.
        /// </summary>
        string GenerateName(ConstructorInfo constructor);

        /// <summary>
        /// Returns the name of <paramref name="field"/> as it would be understood by a developer in the language.
        /// </summary>
        string GenerateName(FieldInfo field);

        /// <summary>
        /// Returns the name of <paramref name="eventx"/> as it would be understood by a developer in the language.
        /// </summary>
        string GenerateName(EventInfo eventx);

        /// <summary>
        /// Returns the name of <paramref name="parameter"/> as it would be understood by a developer in the language.
        /// </summary>
        string GenerateName(ParameterInfo parameter);

        /// <summary>
        /// Returns the code syntax definition of <paramref name="type"/> as it would be understood by a developer in the language.
        /// </summary>
        string GenerateCodeDefinition(Type type);

        /// <summary>
        /// Returns the code syntax definition of <paramref name="method"/> as it would be understood by a developer in the language.
        /// </summary>
        string GenerateCodeDefinition(MethodInfo method);

        /// <summary>
        /// Returns the code syntax definition of <paramref name="property"/> as it would be understood by a developer in the language.
        /// </summary>
        string GenerateCodeDefinition(PropertyInfo property);

        /// <summary>
        /// Returns the code syntax definition of <paramref name="constructor"/> as it would be understood by a developer in the language.
        /// </summary>
        string GenerateCodeDefinition(ConstructorInfo constructor);

        /// <summary>
        /// Returns the code syntax definition of <paramref name="field"/> as it would be understood by a developer in the language.
        /// </summary>
        string GenerateCodeDefinition(FieldInfo field);

        /// <summary>
        /// Returns the code syntax definition of <paramref name="eventx"/> as it would be understood by a developer in the language.
        /// </summary>
        string GenerateCodeDefinition(EventInfo eventx);

        /// <summary>
        /// Returns the code syntax definition of <paramref name="parameter"/> as it would be understood by a developer in the language.
        /// </summary>
        string GenerateCodeDefinition(ParameterInfo parameter);

        /// <summary>
        /// Returns the name of <paramref name="type"/> as it would be understood by a developer in the language.
        /// </summary>
        string GenerateName(TypeDocumentation type);

        /// <summary>
        /// Returns the name of <paramref name="method"/> as it would be understood by a developer in the language.
        /// </summary>
        string GenerateName(MethodDocumentation method);

        /// <summary>
        /// Returns the name of <paramref name="property"/> as it would be understood by a developer in the language.
        /// </summary>
        string GenerateName(PropertyDocumentation property);

        /// <summary>
        /// Returns the name of <paramref name="constructor"/> as it would be understood by a developer in the language.
        /// </summary>
        string GenerateName(ConstructorDocumentation constructor);

        /// <summary>
        /// Returns the name of <paramref name="field"/> as it would be understood by a developer in the language.
        /// </summary>
        string GenerateName(FieldDocumentation field);

        /// <summary>
        /// Returns the name of <paramref name="eventx"/> as it would be understood by a developer in the language.
        /// </summary>
        string GenerateName(EventDocumentation eventx);

        /// <summary>
        /// Returns the code syntax definition of <paramref name="type"/> as it would be understood by a developer in the language.
        /// </summary>
        string GenerateCodeDefinition(TypeDocumentation type);

        /// <summary>
        /// Returns the code syntax definition of <paramref name="method"/> as it would be understood by a developer in the language.
        /// </summary>
        string GenerateCodeDefinition(MethodDocumentation method);

        /// <summary>
        /// Returns the code syntax definition of <paramref name="property"/> as it would be understood by a developer in the language.
        /// </summary>
        string GenerateCodeDefinition(PropertyDocumentation property);

        /// <summary>
        /// Returns the code syntax definition of <paramref name="constructor"/> as it would be understood by a developer in the language.
        /// </summary>
        string GenerateCodeDefinition(ConstructorDocumentation constructor);

        /// <summary>
        /// Returns the code syntax definition of <paramref name="field"/> as it would be understood by a developer in the language.
        /// </summary>
        string GenerateCodeDefinition(FieldDocumentation field);

        /// <summary>
        /// Returns the code syntax definition of <paramref name="eventx"/> as it would be understood by a developer in the language.
        /// </summary>
        string GenerateCodeDefinition(EventDocumentation eventx);
     
        /// <summary>
        /// Returns the code syntax definition of <paramref name="parameter"/> as it would be understood by a developer in the language.
        /// </summary>
        string GenerateCodeDefinition(ParameterDocumentation parameter);
    }
}
